// 云函数入口文件
const cloud = require('wx-server-sdk')
const { authenticator } = require('otplib')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })

// 云函数入口函数
exports.main = async (event, context) => {
  try {
    const { openId, secret, code } = event

    console.log('验证参数:', { openId, secret, code, codeType: typeof code })

    if (!openId || !secret || !code) {
      console.log('参数不完整')
      return {
        success: false,
        message: '参数不完整'
      }
    }

    // 设置TOTP验证选项，允许前后一个窗口的验证码 (±30秒)
    authenticator.options = {
      window: 1, // 允许±1个时间窗口的验证码
      step: 30 // 默认30秒一个时间窗口
    }

    // 确保code是字符串格式
    const tokenCode = String(code).trim()
    console.log('处理后的验证码:', tokenCode)

    // 验证TOTP代码
    try {
      // 直接调用verify函数验证
      const isValid = authenticator.verify({
        token: tokenCode,
        secret
      })

      console.log('验证结果:', isValid)

      if (!isValid) {
        return {
          success: false,
          message: '验证码无效或已过期'
        }
      }
    } catch (verifyError) {
      console.error('TOTP验证出错:', verifyError)
      return {
        success: false,
        message: '验证过程出错: ' + verifyError.message,
        error: verifyError.message
      }
    }

    // 验证通过，将密钥保存到数据库
    const db = cloud.database()
    const userCollection = db.collection('MFA')

    // 查询用户
    const user = await userCollection
      .where({
        openid: openId
      })
      .get()

    console.log('查询用户结果:', user)

    if (user.data.length === 0) {
      // 用户不存在，创建新用户
      console.log('用户不存在，创建新用户')
      try {
        const addResult = await userCollection.add({
          data: {
            openid: openId,
            mfaBound: true,
            mfaSecret: secret,
            mfaBindTime: db.serverDate(),
            createTime: db.serverDate()
          }
        })
        console.log('创建用户结果:', addResult)

        return {
          success: true,
          message: 'MFA绑定成功'
        }
      } catch (addError) {
        console.error('创建用户失败:', addError)
        return {
          success: false,
          message: '创建用户失败: ' + addError.message,
          error: addError.message
        }
      }
    }

    // 用户存在，更新MFA信息
    console.log('更新用户MFA信息')
    try {
      // 更新用户MFA信息
      const updateResult = await userCollection
        .where({
          openid: openId
        })
        .update({
          data: {
            mfaBound: true,
            mfaSecret: secret,
            mfaBindTime: db.serverDate()
          }
        })

      console.log('更新用户结果:', updateResult)

      return {
        success: true,
        message: 'MFA绑定成功'
      }
    } catch (updateError) {
      console.error('更新用户失败:', updateError)
      return {
        success: false,
        message: '更新用户失败: ' + updateError.message,
        error: updateError.message
      }
    }
  } catch (error) {
    console.error('Verify and bind MFA error:', error)
    return {
      success: false,
      message: error.message || '验证并绑定MFA失败',
      error: error.message
    }
  }
}
